package com.zpark.resume.service.impl;

import com.zpark.resume.entity.Cv;
import com.zpark.resume.entity.Member;
import com.zpark.resume.entity.vo.CvVO;
import com.zpark.resume.exception.*;
import com.zpark.resume.mapper.ICvMapper;
import com.zpark.resume.service.ICvService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * @PackageName: com.zpark.resume.service.impl
 * @ClassName: CvServiceImpl
 * @Description:
 * @author: RZS
 * @date: 2023/6/1  15:54
 */
@Service
public class CvServiceImpl implements ICvService {

    @Autowired
    private ICvMapper cvMapper;

    /**
     * 根据职位搜索简历
     * @param direction 职位数据
     * @return
     */
    @Override
    public List<Cv> searchCvByDirection(String direction) {
        // 判断求职方向是否为null
        if (StringUtils.isBlank(direction)) {
            // 如果为null，抛出异常DirectionIsNullException("搜索的字段值为空，请输入关键词")
            throw new DirectionIsNullException("搜索的字段值为空，请输入关键词");
        }

        // 调用持久层接口查询数据
        List<Cv> cvList = cvMapper.selectByDesiredDirectionLike("%" + direction + "%");
        // 判断查询结果是否为null
        if (cvList.size() <= 0) {
            // 结果为null，抛出异常SearchCvByDirectionDataIsNullException("搜索的结果为空")
            throw new SearchCvByDirectionDataIsNullException("搜索的结果为空");
        }

        // 返回搜索的数据
        return cvList;
    }

    /**
     * 查询公开简历数据
     * @return
     */
    @Override
    public List<Cv> searchOpenCv() {
        // 调用持久层接口查询数据
        List<Cv> cvList = cvMapper.selectOpenCv();
        // 判断查询结果是否为空
        if (cvList.size() <= 0) {
            // 结果为空，抛出异常SearchOpenCvDataIsNullException("没有公开的简历数据")
            throw new SearchOpenCvDataIsNullException("没有公开的简历数据");
        }

        return cvList;
    }

    /**
     * 根据cv的id查询数据
     * @param id cv_id
     * @return
     */
    @Override
    public Cv findCvById(Integer id) {
        // 调用持久层接口查询数据
        Cv cv = cvMapper.selectById(id);
        // 判断查询结果
        if (cv == null) {
            // 结果为空，抛出异常FindCvByIdIsNullException("无效的ID")
            throw new FindCvByIdIsNullException("无效的ID");
        }

        return cv;
    }

    /**
     * 根据member_id查询cv数据
     * @param member
     * @return
     */
    @Override
    public CvVO findByMemberId(Member member) {
        // 判断memberId是否合法
        if (member == null || member.getId() == 0 || member.getId() == null) {
            throw new FindCvByIdIsNullException("无效的memberID");
        }
        // 调用持久层接口查询数据
        CvVO cvVO = cvMapper.selectByMemberId(member.getId());

        // 判断查询是否有结果，如果没有结果，则抛出异常
        if (cvVO == null) {
            throw new LoadCvDataIsNullException("没有对应的简历数据");
        }

        return cvVO;
    }

    /**
     * 根据id修改简历数据（包含修改基本信息和职位期望）
     * @param cv
     * @return
     */
    @Override
    public Integer changeCvById(Cv cv) {
        // 判断cv对象是否未null，以及cv.id是否不存在
        if (cv == null || cv.getId() == 0 || cv.getId() == null) {
            // 数据不合法，修改失败
            throw new UpdateCvDataErrorException("修改基本信息或者期望职位失败，原因未知");
        }
        cv.setUpdateTime(new Date());
        // 调用持久层接口实现修改数据
        Integer row = cvMapper.updateCvById(cv);
        // 判断是否修改成功
        if (row <= 0) {
            // 修改失败
            throw new UpdateCvDataErrorException("修改基本信息或者期望职位失败，原因未知");
        }
        // 返回受影响的行数
        return row;
    }
}
